﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SRS.Encryption
{
    public class Block
    {
        private byte[] byteArray;

        /// <summary>
        /// Konstruktor dengan parameter panjang array of byte
        /// </summary>
        /// <param name="length"></param>
        public Block(int length)
        {
            byteArray = new byte[length];
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="value"></param>
        public Block(byte[] value)
        {
            byteArray = new byte[value.Length];
            Array.Copy(value, byteArray, value.Length);
        }

        public Block(Block block)
            : this(block.getByteArray())
        {

        }

        /// <summary>
        /// fungsi untuk mengembalikan array of byte
        /// </summary>
        /// <returns></returns>
        public byte[] getByteArray()
        {
            return byteArray;
        }

        /// <summary>
        /// prosedur untuk mengeset byteArray dengan value
        /// </summary>
        /// <param name="value"></param>
        public void setByteArray(byte[] value)
        {
            byteArray = value;
        }

        /// <summary>
        /// fungsi untuk mengembalikan byte pada index ke index
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public byte getElement(int index)
        {
            return byteArray[index];    
        }

        /// <summary>
        /// prosedur untuk mengeset byte pada suatu index
        /// </summary>
        /// <param name="index"></param>
        /// <param name="value"></param>
        public void setElement(int index, byte value)
        {
            byteArray[index] = value;
        }

        /// <summary>
        /// fungsi yang mengembalikan panjang blok
        /// </summary>
        /// <returns></returns>
        public int getLengthBlock()
        {
            return byteArray.Length;
        }

        /// <summary>
        /// prosedur untuk merotasi blok sejauh penjumlahan nilai block
        /// </summary>
        public void eRotate()
        {
            int rotateNum;
            int sum = 0;
            byte[] tempByte = new byte[byteArray.Length];
            int j = 0;

            foreach (byte b in this.byteArray)
            {
                sum += (int)b;
            }
            if (byteArray.Length != 0)
            {
                rotateNum = sum % byteArray.Length;
            }
            else rotateNum = 0;

            for (int i = rotateNum; i < byteArray.Length; ++i)
            {
                tempByte[j] = byteArray[i];
                ++j;
            }
            for (int i = 0; i < rotateNum; ++i)
            {
                tempByte[j] = byteArray[i];
                ++j;
            }
            for (int i = 0; i < byteArray.Length; ++i)
            {
                byteArray[i] = tempByte[i];
            }
        }

        /// <summary>
        /// prosedur untuk mengembalikan susunan semula setelah dirotasi sejauh sum block
        /// </summary>
        public void dRotate()
        {
            int rotateNum;
            int sum = 0;
            byte[] tempByte = new byte[byteArray.Length];
            int j = 0;

            foreach (byte b in this.byteArray)
            {
                sum += (int)b;
            }

            if (byteArray.Length != 0)
            {
                rotateNum = byteArray.Length - (sum % byteArray.Length);
            }
            else rotateNum = 0;

            for (int i = rotateNum; i < byteArray.Length; ++i)
            {
                tempByte[j] = byteArray[i];
                ++j;
            }
            for (int i = 0; i < rotateNum; ++i)
            {
                tempByte[j] = byteArray[i];
                ++j;
            }
            for (int i = 0; i < byteArray.Length; ++i)
            {
                byteArray[i] = tempByte[i];
            }
        }

        /// <summary>
        /// prosedur untuk mencetak Block ke layar
        /// </summary>
        public void printBlock()
        {
            foreach (byte b in byteArray)
            {
                Console.Write(b + ", ");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// prosedur untuk mencetak Block ke layar
        /// </summary>
        public static void printBlock(byte[] byteArray)
        {
            foreach (byte b in byteArray)
            {
                Console.Write(b + ", ");
            }
            Console.WriteLine();
        }
    }
}
